#pragma once

using namespace std;

template <class T> class queue {
	
	public :

		virtual ~queue() = default;

		/* return true if the queue is empty */
		virtual bool empty() const = 0;
		
		/* return the number of elements in the queue */
		virtual bool size() const = 0;

		/* return the reference to the front element */
		virtual T& front() = 0;

		/* return the reference to the back element */
		virtual T& back() = 0;

		/* remove the front element */
		virtual void pop() = 0;

		/* add the element at the back of the queue */
		virtual void push(const T& theElement) = 0;

};